import API from "./../api";
import { routerRedux } from 'dva/router'

export default {

  /**
   * 【命名空间】
   * 是外部分发（dispatch）调用model时，actions里type属性的前缀，后面跟reducers或effect的方法名。
   * model内部调用方法使用时可是省略前缀。
   */
  namespace: "global",

  /**
   * 存储全局变量的仓库，结构对象和数组都可。
   * 仓库是不可变数据，要改变通过特定方法，改变后重新渲染
   */
  state: {
    token: "",
    roles: [],
    username: "",
  },

  /**
   * 存放action方法的对象
   * 需要使用dispatch调用，不能直接改变state
   * 每个方法都是一个Generator函数，也就是需要在前面加*
   * 然后如果有异步操作就可以用 yield 去等待他的返回结果
   * 在里面做完操作后，使用put去调用reducers里面对应的方法，去改变state
   */
   effects: {
    *setUserInfo({ payload }, { call, put }) {
      yield put({ type: "save", payload });
      const { roles, username } = yield API.getUserInfo();
      yield put({ type: "save", payload: { username, roles } });

      /**
       * 用递归的方式，拿到当前有权限的第一个菜单跳转
       * 如果说，一个菜单权限都没有，我们可以不跳转
       * 弹框提示该角色暂无菜单
       */
      yield put(
        routerRedux.push(
          roles.includes("inspec")
            ? "/storeManage/company"
            : "/storeManage/culturalAuditorium"
        )
      );
    },
  },

  /**
    * 必须有返回值，
    * 有effects通过put调用
    * return的值可以直接改变state
    * 但是要注意：return的值，是啥state就是啥
    */
  reducers: {
    save(state, action) {
      console.log(state,action);
      return { ...state, ...action.payload };
    },
  },
};


// const getData = () => {
//   return new Promise((res, rej) => {
//     setTimeout(() => {
//       res(100)
//     }, 2000)
//   })
// }

// export default {
//   namespace: "global",
//   // 不可变数据,要改变通过特定方法,改变后重新渲染
//   state: {
//     num: 100
//   },
//   /**
//    * 存放action方法的对象
//    * 需要使用dispatch调用，不能直接改变state
//    * 每个方法都是一个Generator函数，也就是需要在前面加*
//    * 然后如果有异步操作就可以用 yield 去等待他的返回结果
//    * 在里面做完操作后，使用put去调用reducers里面对应的方法，去改变state
//    */
//   effect: {
//     *add({ payload }, { call, put }) {
//       console.log("payload是接到的数据:", payload);
//       const data = yield getData();
//       console.log("yield getData():", data);
//       yield put({ type: "save", payload })
//     }
//   },
//   /**
//    * 必须有返回值，
//    * 有effects通过put调用
//    * return的值可以直接改变state
//    * 但是要注意：return的值，是啥state就是啥
//    */
//   reducers: {
//     save(state, action) {
//       console.log(state, action);
//       return { ...state, ...action.payload }
//     }
//   }
// }